package com.wwu.service.impl;

import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.wwu.common.JaxbUtil;
import com.wwu.common.WsConst;
import com.wwu.entity.dict.*;
import com.wwu.mapper.dict.*;
import com.wwu.service.IEmrDictService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import javax.annotation.Resource;
import javax.jws.WebService;
import java.util.List;
import java.util.regex.Pattern;

/**
 * 电子病历系统基础字典服务实现类
 * @Author: 一蓑烟雨
 * @CreateTime: 2022-03-16 11:52
 * @Version: 1.0.0
 **/
@Slf4j
@WebService(targetNamespace = WsConst.NAMESPACE_URI, endpointInterface = WsConst.ENDPOINT_IINTERFACE+"IEmrDictService")
@Component
public class EmrDictServiceImpl implements IEmrDictService {
    @Resource
    private DiagDictMapper diagDictMapper;

    /**
     * 获取诊断字典信息
     * @param diagCode 诊断编码
     * @param diagName 诊断类型
     * @param diagClassCodes 诊断分类编码集合(默认为空，0001-西医诊断;0002-中医疾病诊断;0003-中医症候诊断;
     *                       0004-院自备；多个请以英文逗号分割)
     * @param diagTypeCodes 诊断类型编码集合(默认为空，001-普通诊断;002-病理诊断;003-损伤中毒外部原因；多个请以英文逗号分割)
     * @param py	拼音码
     * @param available 可用标记(Y：表示可用；N：表示不可用)
     * @param responseType 响应类型(json或xml，默认json)
     * @return: java.lang.String
     * @Author: 一蓑烟雨
     * @Date: 2022/3/16 0016 下午 12:18
     */
    @Override
    public String getDiagDictInfo(String diagCode, String diagName, String diagClassCodes,
                                  String diagTypeCodes, String py, String available,String responseType) {
        //将参数设置到对象中
        DiagDict diagDict = new DiagDict();
        diagDict.setDiagCode(diagCode);
        diagDict.setDiagName(diagName);
        diagDict.setDiagClassCode(diagClassCodes);
        diagDict.setDiagTypeCode(diagTypeCodes);
        diagDict.setPy(py.toUpperCase());
        diagDict.setAvailable(available);

        DiagDictData ddd = new DiagDictData();
        try {
            //diagClassCodes验证规则
            String regEx1 = "(0001\\,|0002\\,|0003\\,|0004\\,)*(0001|0002|0003|0004)$";
            //diagTypeCodes验证规则
            String regEx2 = "(001\\,|002\\,|003\\,)*(001|002|003)$";
            if(StringUtils.hasText(diagClassCodes) && !Pattern.matches(regEx1, diagClassCodes)){
                ddd.setCode(2);
                ddd.setMsg("diagClassCode参数不符合规范(默认为空，可取值：0001-西医诊断、0002-中医疾病诊断、0003-中医症候诊断、" +
                        "0004-院自备；多个请以英文逗号分割)！");
            }else if(StringUtils.hasText(diagTypeCodes) && Pattern.matches(regEx2, diagTypeCodes)){
                ddd.setCode(2);
                ddd.setMsg("diagTypeCode参数不符合规范(默认为空，可取值：001-普通诊断、002-病理诊断、003-损伤中毒外部原因；" +
                        "多个请以英文逗号分割)！");
            }else{
                List<DiagDict> ddlist = diagDictMapper.getDiagDictInfo(diagDict);
                ddd.setCode(1);
                ddd.setMsg("诊断字典获取成功");
                ddd.setDiagDictInfo(ddlist);
            }
        } catch (Exception e) {
            log.error("------->诊断字典获取失败",e);
            ddd.setCode(2);
            ddd.setMsg("诊断字典获取失败");
        }

        String retStr = null;
        //数据进行转换返回到客户端
        if(WsConst.RESPONSE_XML.equals(responseType)){
            retStr = JaxbUtil.convertToXmlHeader(ddd);
        }else{
            retStr = JSONObject.toJSONString(ddd,SerializerFeature.WriteNullStringAsEmpty);
        }
        log.info("------->诊断字典获取成功,返回信息为：{}",retStr);
        return retStr;
    }
}
